//
//  HJStatus.swift
//  HJWeiBo
//
//  Created by 黄珏 on 15/10/31.
//  Copyright © 2015年 黄珏. All rights reserved.
//

import UIKit
import SDWebImage

class HJStatus: NSObject {
    // MARK: - 属性
    
    /// 微博创建时间
    var created_at: String?
    
    /// 微博ID
    var id: Int = 0
    
    /// 微博信息内容
    var text: String?
    
    /// 微博来源
    var source: String?
    
    /// 微博的配图 注意：数组类型
    var pic_urls: [[String: AnyObject]]? {
        didSet {
            let count = pic_urls?.count
            if count == 0 {
                return
            }
//            创建一个url数组,里面存了一个一个的url
            storePictureURLs = [NSURL]()
            for dict in pic_urls! {
                if let urlStr = dict["thumbnail_pic"] as? String {
                    
                    storePictureURLs?.append(NSURL(string: urlStr)!)
                }
            }
        }
    }
    
    var pictureURLs: [NSURL]? {
        get {
            return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
        }
    }
    
    //    直接返回配图的url数组
    var storePictureURLs: [NSURL]?
    
    //    判断是原创微博还是转发微博
    func cellID() -> String{
        return retweeted_status == nil ? HJStatusCellIdentifier.NormalCell.rawValue : HJStatusCellIdentifier.ForwardCell.rawValue
    }
    
    /// 用户模型
    var user: HJUser?
    
    //    转发微博字段
    var retweeted_status: HJStatus?
    
    //    行高
    var rowHeigh: CGFloat?
    
    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    // KVC赋值每个属性的时候都会调用
    override func setValue(value: AnyObject?, forKey key: String) {
        // 判断user赋值时, 自己字典转模型
        //        print("key:\(key), value:\(value)")
        if key == "user" {
            if let dict = value as? [String: AnyObject] {
                // 字典转模型
                // 赋值
                user = HJUser(dict: dict)
                // 一定要记得return
                return
            }
        }
        
        if key == "retweeted_status" {
            if let dict = value as? [String: AnyObject] {
                retweeted_status = HJStatus(dict: dict)
            }
            return
        }
        
        return super.setValue(value, forKey: key)
    }
    
    class func loadStatus(since_id: Int, max_id: Int, finish:(list:[HJStatus]?,error: NSError?) -> ()) {
        
        NetworkTools.shareInstance.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
            if error != nil {
            finish(list: nil, error: error)
            return
            }
        // 没有出错,获取返回数据里面的微博数据
        if let array = result?["statuses"] as? [[String: AnyObject]] {
//            创建模型数组
            var arrayM = [HJStatus]()
            for dict in array {
                arrayM.append(HJStatus(dict: dict))
            }
            
//            转换完成 通知调用者
            self.cacheWebImage(arrayM, finished: finish)
//            finish(list: arrayM, error: nil)
        } else {
            finish(list: nil, error: nil)
            }
        }
    }
    
    
    class func cacheWebImage(statuses: [HJStatus]?, finished: (statuses: [HJStatus]?, error: NSError?) -> ()) {
        // 创建任务组
        let group = dispatch_group_create()
        
        // 判断是否有模型
        guard let list = statuses else {
            // 没有模型
            return
        }
        
        // 记录缓存图片的大小
        var length = 0
        
        // 遍历模型
        for status in list {
            // 如果没有图片需要下载,接着遍历下一个
            let count = status.pictureURLs?.count ?? 0
            if count == 0 {
                // 没有图片,遍历下一个模型
                continue
            }
            
            // 判断是否有图片需要下载
            if let urls = status.pictureURLs {
                // 有需要缓存的图片,遍历,一张-张缓存
                //                for url in urls {
                if urls.count == 1 {
                    let url = urls[0]
                    print(url)
                    // 缓存图片
                    // 在缓存之前放到任务组里面
                    dispatch_group_enter(group)
                    
                    SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                        // 离开组
                        dispatch_group_leave(group)
                        
                        // 判断有没有错误
                        if error != nil {
                            print("下载图片出错:\(url)")
                            return
                        }
                        
                        // 没有出错
                        print("下载图片完成:\(url)")
                        
                        // 记录下载图片的大小
                        if let data = UIImagePNGRepresentation(image) {
                            length += data.length
                        }
                    })
                }
            }
        }
        
        // 所有图片都下载完,在通知调用者
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("所有图片下载完成,告诉调用者获取到了微博数据: 大小:\(length / 1024)")
            // 通知调用者,已经有数据
            finished(statuses: statuses, error: nil)
        }
    }
}
